package com.wang.bootbuilder.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wang.bootbuilder.entity.param.AddOrUpdateProductParam;
import com.wang.bootbuilder.entity.param.SelectProductByPageParam;
import com.wang.bootbuilder.entity.pojo.Product;
import com.wang.bootbuilder.entity.result.GetProductListByPageResult;
import com.wang.bootbuilder.mapper.ProductMapper;
import com.wang.bootbuilder.tools.JsonResult;
import com.wang.bootbuilder.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import springfox.documentation.spring.web.json.Json;

import java.sql.Wrapper;
import java.util.List;

@Service
public class ProductService {

    @Autowired
    ProductMapper productMapper;

    /*
    获取商品分页列表
    通过mp实现后台分页
     */
    public JsonResult getProductListByPage(SelectProductByPageParam param) {
        // 页码数
        Integer pageNum = param.getPageNum();
        // 一页显示条数
        int pageSize = param.getPageSize();
        // 分页查询
        Page<Product> pageQuery = new Page<>(pageNum, pageSize);
        Page<Product> pageResult = productMapper.selectPage(pageQuery, null);
        // 总记录数
        int totalCount = pageResult.getRecords().size();
        // 总页数
        int totalPages = getTotalPages(totalCount, pageSize);
        // 获取返回值
        GetProductListByPageResult result = getProductListResult(param.getPageNum(), totalPages, pageSize, totalCount, pageResult.getRecords());
        return JsonResult.ok().data("products", result);
    }

    /*
    根据ID/Name搜索产品分页列表
     */
    public JsonResult getConditionProductListByPage(SelectProductByPageParam param) {
        // 页码数
        Integer pageNum = param.getPageNum();
        // 一页显示条数
        int pageSize = param.getPageSize();
        // 检索条件
        Page<Product> pageQuery = new Page<>(pageNum, pageSize);
        QueryWrapper<Product> queryWrapper = new QueryWrapper<>();
        // 判断根据名称还是根据描述
        if (StringUtils.isNotEmpty(param.getProductName())) {
            queryWrapper.like("product_name", param.getProductName());
        } else if (StringUtils.isNotEmpty(param.getProductDesc())) {
            queryWrapper.like("desc", param.getProductDesc());
        }
        Page<Product> pageResult = productMapper.selectPage(pageQuery, queryWrapper);
        // 总记录数
        int totalCount = pageResult.getRecords().size();
        // 总页数
        int totalPages = getTotalPages(totalCount, pageSize);
        // 获取返回值
        GetProductListByPageResult result = getProductListResult(param.getPageNum(), totalPages, pageSize, totalCount, pageResult.getRecords());
        return JsonResult.ok().data("list", result);
    }

    /*
    添加商品信息
     */
    public JsonResult addProduct(AddOrUpdateProductParam param) {
        // 判断要添加的商品是否已经存在
        QueryWrapper<Product> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("pcategory_id", param.getPcategoryId());
        queryWrapper.eq("product_name", param.getProductName());
        List<Product> productList = productMapper.selectList(queryWrapper);
        if (!CollectionUtils.isEmpty(productList)) {
            JsonResult.error().message("该商品已经存在，无法添加");
        }
        // 添加商品
        Product insertProduct = new Product();
        insertProduct.setCategoryId(param.getCategoryId());
        insertProduct.setPcategoryId(param.getPcategoryId());
        insertProduct.setProductName(param.getProductName());
        insertProduct.setProductDesc(param.getDesc());
        insertProduct.setPrice(param.getPrice());
        insertProduct.setDetail(param.getDetail());
        insertProduct.setImage(param.getImg().size() == 0 ? null : param.getImg().get(0));
        insertProduct.setStatus(0);
        productMapper.insert(insertProduct);
        return JsonResult.ok();
    }

    /*
    删除商品
     */
    public JsonResult deleteProduct(String productId) {
        int i = productMapper.deleteById(productId);
        if (i == 0) {
            return JsonResult.error().message("删除失败");
        }
        return JsonResult.ok();
    }

    /*
    修改商品信息
     */
    public JsonResult updateProduct(AddOrUpdateProductParam param) {
        // 乐观锁
        Product product = productMapper.selectById(param.getId());
        product.setCategoryId(param.getCategoryId());
        product.setPcategoryId(param.getPcategoryId());
        product.setProductName(param.getProductName());
        product.setProductDesc(param.getDesc());
        product.setDetail(param.getDetail());
        product.setPrice(param.getPrice());
        product.setImage(param.getImg().size() == 0 ? null : param.getImg().get(0));
        product.setCreateBy(null);
        product.setUpdateBy(null);
        product.setCreateTime(null);
        product.setUpdateBy(null);
        // 更新商品信息
        int i = productMapper.updateById(product);
        if (i == 0) {
            JsonResult.error().message("该商品已被其他用户更改，请重新检索后再次尝试");
        }
        return JsonResult.ok();
    }

    /*
    对商品进行上架/下架处理
     */
    public JsonResult onOffShelfProduct(Long productId, Integer status) {
        // 更新商品状态前乐观锁处理
        Product product = productMapper.selectById(productId);
        product.setStatus(status);
        product.setCreateBy(null);
        product.setUpdateBy(null);
        product.setCreateTime(null);
        product.setUpdateTime(null);
        int i = productMapper.updateById(product);
        if (i == 0) {
            return JsonResult.error().message("该商品信息已经被他人修改，请重新检索后再次尝试");
        }
        return JsonResult.ok();
    }

    // 获取总页数
    private int getTotalPages(Integer totalCount, Integer pageSize) {
        // 总页数
        int totalPages = totalCount / pageSize;
        if (totalCount % pageSize != 0) {
            totalPages++;
        }
        return totalPages;
    }

    // 获取返回值
    private GetProductListByPageResult getProductListResult(int PageNum, int totalPages, int pageSize, int totalCount, List<Product> recordsList) {
        GetProductListByPageResult result = new GetProductListByPageResult();
        result.setPageNum(PageNum);
        result.setPages(totalPages);
        result.setPageSize(pageSize);
        result.setTotal(totalCount);
        result.setList(recordsList);
        return result;
    }

}
